﻿#pragma once
#include "../GameApp/math.h"
#include <optional>

namespace engine
{
	namespace render
	{
		class Camera
		{
		public:
			Camera(glm::vec2 viewportSize, glm::vec2 position = glm::vec2(0.0f, 0.0f), std::optional<engine::utils::Rect> mimit_bounds = std::nullopt);
			~Camera() = default;

			Camera(const Camera&) = delete;
			Camera& operator=(const Camera&) = delete;
			Camera(Camera&&) = delete;
			Camera& operator=(Camera&&) = delete;

			void update(float deltaTime); //更新相机位置
			void move(const glm::vec2& delta); //移动相机位置

			glm::vec2 worldToScreen(const glm::vec2& worldPos) const; //将世界坐标转换为屏幕坐标
			glm::vec2 worldToScreenwithParallax(const glm::vec2& worldPos, glm::vec2& scroll_factor) const; //将世界坐标转换为相机坐标，考虑视差效果
			glm::vec2 screenToWorld(const glm::vec2& screemPos) const; //将屏幕坐标转换为世界坐标

			void setPosition(const glm::vec2& position); //设置相机位置
			void setLimitBounds(const std::optional<engine::utils::Rect>& bounds); //设置世界边界

			const glm::vec2& getPosition() const;        //获取相机位置
			const glm::vec2& getViewportSize() const;   //获取视口尺寸
			std::optional<engine::utils::Rect> getLimitBounds() const; //获取世界边界

		private:
			void clampPosition(); //限制相机位置在世界边界内
		private:
			glm::vec2 m_viewportSize;                   //视口尺寸
			glm::vec2 m_position;                           //相机位置（左上角）
			std::optional<engine::utils::Rect> m_limit_bounds; //世界边界，nullopt表示无限大
		};
	}
}